package src.com.bjsxt.base.sync004;

import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.StampedLock;

/**
 * 业务整体需要使用完整的synchronized，保持业务的原子性。
 * @author alienware
 *
 */
public class DirtyRead {

	private String username = "bjsxt";
	private String password = "123";

	StampedLock lock = new StampedLock();
	ReentrantReadWriteLock locks = new ReentrantReadWriteLock();
	private ReentrantReadWriteLock.ReadLock readLock = locks.readLock();
	private ReentrantReadWriteLock.WriteLock writeLock = locks.writeLock();
	public    void setValue(String username, String password){
		long l = lock.writeLock();
		//writeLock.lock();
		this.username = username;
		
		try {
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		this.password = password;
		System.out.println("setValue最终结果：username = " + username + " , password = " + password);
		//writeLock.unlock();
		lock.unlock(l);
	}
	
	public    void getValue() throws InterruptedException {
		//readLock.lock();
		Thread.sleep(2000);
		long stamp = lock.tryOptimisticRead();
		//long l = lock.readLock();
		if(!lock.validate(stamp)){
			long a = lock.readLock();
			System.out.println("getValue方法得到1：username = " + this.username + " , password = " + this.password);
			//lock.unlockRead(a);
			lock.unlock(a);
		}else{
			System.out.println("getValue方法得到：username = " + this.username + " , password = " + this.password);
		}
		//readLock.unlock();
	}
	
	
	public static void main(String[] args) throws Exception{
		
		final DirtyRead dr = new DirtyRead();

		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				dr.setValue("z3", "456");		
			}
		});
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					dr.getValue();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});

		t1.start();
		t2.start();
		Thread.sleep(1000);
		

	}
	
	
	
}
